package br.com.netomarin.bundesliga.commons;

import java.io.UnsupportedEncodingException;
import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import br.com.netomarin.bundesliga.model.MatchModel;
import br.com.netomarin.bundesliga.persistence.Match;

public class UtilCommons {

	public static boolean sendMatchEmail(Match m) {
		Properties props = new Properties();
		Session session = Session.getDefaultInstance(props, null);

		String toP1 = null, toP2 = null, ccP1 = null, ccP2 = null;
		if (m.getNotifier().equalsIgnoreCase(m.getHomeP1())
				|| (m.getHomeP2() != null && m.getNotifier().equalsIgnoreCase(
						m.getHomeP2()))) {
			toP1 = m.getVisitorP1();
			toP2 = m.getVisitorP2();
			ccP1 = m.getHomeP1();
			ccP2 = m.getHomeP2();
		} else {
			toP1 = m.getHomeP1();
			toP2 = m.getHomeP2();
			ccP1 = m.getVisitorP1();
			ccP2 = m.getVisitorP2();
		}

		try {
			Message msg = new MimeMessage(session);
			msg.setFrom(new InternetAddress("netomarin@google.com",
					"Bundesliga - BR-SAO"));
			msg.addRecipient(Message.RecipientType.TO, new InternetAddress(toP1
					+ "@google.com", toP1));
			if (toP2 != null) {
				msg.addRecipient(Message.RecipientType.TO, new InternetAddress(
						toP2 + "@google.com", toP2));
			}

			if (ccP1 != null) {
				msg.addRecipient(Message.RecipientType.CC, new InternetAddress(
						ccP1 + "@google.com", ccP1));
			}

			if (ccP2 != null) {
				msg.addRecipient(Message.RecipientType.CC, new InternetAddress(
						ccP2 + "@google.com", ccP2));
			}

			msg.setSubject("[Bundesliga BR-SAO] Notificação de partida");
			String msgBody = getMatchHtmlMessage(m, toP1, toP2);
			msg.setContent(msgBody, "text/html");
			Transport.send(msg);

		} catch (AddressException e) {
			// ...
		} catch (MessagingException e) {
			// ...
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return true;
	}

	private static String getMatchHtmlMessage(Match m, String toP1, String toP2) {
		StringBuffer sb = new StringBuffer();
		sb.append("<html>");
		sb.append("<head></head>");
		sb.append("<body>");
		sb.append("<p>Ol&aacute; " + toP1);
		if (toP2 != null)
			sb.append(" e " + toP2);

		sb.append("<p>"
				+ m.getNotifier()
				+ " notificou que voc&ecirc;s jogaram uma partida v&aacute;lida pela Bundesliga, a liga de Fifa Soccer do Google Brasil em S&atilde;o Paulo.");

		sb.append("<p>A partida foi:");
		sb.append("<br>" + m.getHomeP1());
		if (m.getHomeP2() != null)
			sb.append(" / " + m.getHomeP2());
		sb.append(" (" + m.getHomeTeam() + ") " + m.getScoreHomeTeam() + " X ");
		sb.append(m.getScoreVisitorTeam() + " " + m.getVisitorP1());
		if (m.getVisitorP2() != null)
			sb.append(" / " + m.getVisitorP2());
		sb.append(" (" + m.getVisitorTeam() + ")");

		sb.append("<p>Voc&ecirc; concorda com essa partida?");
		sb.append("<br>Se sim, clique <a href=\"https://bundesliga-br.googleplex.com/confirm?match="
				+ m.getKey() + "\">aqui para confirmar</a>.");
		sb.append("<br>Caso discorde, clique <a href=\"https://bundesliga-br.googleplex.com/disprove?match="
				+ m.getKey() + "\">aqui para sugerir um novo resultado</a>.");

		sb.append("<p>Obrigado e bons jogos!");
		sb.append("<body>");
		sb.append("</html>");

		return sb.toString();
	}

	public static boolean sendChallengedMatchEmail(Match m) {
		Properties props = new Properties();
		Session session = Session.getDefaultInstance(props, null);
		Match cm = MatchModel.loadMatchByKey(m.getChallengedMatch());
		String toP1 = null, toP2 = null;

		if (m.getNotifier().equalsIgnoreCase(cm.getHomeP1())
				|| (cm.getHomeP2() != null && m.getNotifier().equalsIgnoreCase(
						cm.getHomeP2()))) {
			toP1 = cm.getVisitorP1();
			if (cm.getVisitorP2() != null && !cm.getVisitorP2().isEmpty())
				toP2 = cm.getVisitorP2();
		} else {
			toP1 = cm.getHomeP1();
			if (cm.getHomeP2() != null && !cm.getHomeP2().isEmpty())
				toP2 = cm.getHomeP2();
		}

		try {
			Message msg = new MimeMessage(session);
			msg.setFrom(new InternetAddress("netomarin@google.com",
					"Bundesliga - BR-SAO"));
			
			msg.addRecipient(
					Message.RecipientType.CC,
					new InternetAddress(m.getNotifier() + "@google.com", m
							.getNotifier()));
			
			msg.addRecipient(
					Message.RecipientType.TO,
					new InternetAddress(m.getHomeP1() + "@google.com", m
							.getHomeP1()));			
			
			if (m.getHomeP2() != null && !m.getHomeP2().isEmpty()) {
				msg.addRecipient(Message.RecipientType.TO, new InternetAddress(
						m.getHomeP2() + "@google.com", m.getHomeP2()));
			}

			msg.addRecipient(
					Message.RecipientType.TO,
					new InternetAddress(m.getVisitorP1() + "@google.com", m
							.getVisitorP1()));

			if (m.getVisitorP2() != null && !m.getVisitorP2().isEmpty()) {
				msg.addRecipient(Message.RecipientType.TO, new InternetAddress(
						m.getVisitorP2() + "@google.com", m.getVisitorP2()));
			}

			msg.setSubject("[Bundesliga BR-SAO] Desafio de partida notificada");
			String msgBody = getChallengedMatchHtmlMessage(m, cm, toP1, toP2);
			msg.setContent(msgBody, "text/html");
			Transport.send(msg);

		} catch (AddressException e) {
			// ...
		} catch (MessagingException e) {
			// ...
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return true;
	}

	private static String getChallengedMatchHtmlMessage(Match m, Match cm,
			String toP1, String toP2) {
		StringBuffer sb = new StringBuffer();
		sb.append("<html>");
		sb.append("<head></head>");
		sb.append("<body>");
		sb.append("<p>Ol&aacute; " + toP1);
		if (toP2 != null)
			sb.append(" e " + toP2);

		sb.append("<p>" + m.getNotifier()
				+ " discordou de uma partida que foi notificada por "
				+ cm.getNotifier() + ".");

		sb.append("<p>A partida notificada foi:");
		sb.append("<br>" + cm.getHomeP1());
		if (cm.getHomeP2() != null)
			sb.append(" / " + cm.getHomeP2());
		sb.append(" (" + cm.getHomeTeam() + ") " + cm.getScoreHomeTeam()
				+ " X ");
		sb.append(cm.getScoreVisitorTeam() + " " + cm.getVisitorP1());
		if (cm.getVisitorP2() != null)
			sb.append(" / " + cm.getVisitorP2());
		sb.append(" (" + cm.getVisitorTeam() + ")");

		sb.append("<p>A <b>nova</b> partida proposta foi:");
		sb.append("<br>" + m.getHomeP1());
		if (m.getHomeP2() != null)
			sb.append(" / " + m.getHomeP2());
		sb.append(" (" + m.getHomeTeam() + ") " + m.getScoreHomeTeam() + " X ");
		sb.append(m.getScoreVisitorTeam() + " " + m.getVisitorP1());
		if (m.getVisitorP2() != null)
			sb.append(" / " + m.getVisitorP2());
		sb.append(" (" + m.getVisitorTeam() + ")");

		sb.append("<p>Voc&ecirc; concorda com essa partida?");
		sb.append("<br>Se sim, clique <a href=\"https://bundesliga-br.googleplex.com/confirm?match="
				+ m.getKey() + "\">aqui para confirmar</a>.");
		sb.append("<br>Caso discorde, clique <a href=\"https://bundesliga-br.googleplex.com/escalate?match="
				+ m.getKey()
				+ "\">aqui enviar essa partida para os moderadores</a>.");

		sb.append("<p>Obrigado e bons jogos!");
		sb.append("<body>");
		sb.append("</html>");

		return sb.toString();
	}

	public static boolean sendEscalatedMatchEmail(Match m) {
		Properties props = new Properties();
		Session session = Session.getDefaultInstance(props, null);
		Match cm = MatchModel.loadMatchByKey(m.getChallengedMatch());

		try {
			Message msg = new MimeMessage(session);
			msg.setFrom(new InternetAddress("netomarin@google.com",
					"Bundesliga - BR-SAO"));
			
			msg.addRecipient(
					Message.RecipientType.TO,
					new InternetAddress("netomarin@google.com", m
							.getHomeP1()));
			
			msg.addRecipient(
					Message.RecipientType.TO,
					new InternetAddress("brunoportella@google.com", m
							.getHomeP1()));
			
			msg.addRecipient(
					Message.RecipientType.CC,
					new InternetAddress(m.getHomeP1() + "@google.com", m
							.getHomeP1()));
			
			if (m.getHomeP2() != null && !m.getHomeP2().isEmpty()) {
				msg.addRecipient(Message.RecipientType.TO, new InternetAddress(
						m.getHomeP2() + "@google.com", m.getHomeP2()));
			}

			msg.addRecipient(
					Message.RecipientType.CC,
					new InternetAddress(m.getVisitorP1() + "@google.com", m
							.getVisitorP1()));

			if (m.getVisitorP2() != null && !m.getVisitorP2().isEmpty()) {
				msg.addRecipient(Message.RecipientType.CC, new InternetAddress(
						m.getVisitorP2() + "@google.com", m.getVisitorP2()));
			}

			msg.setSubject("[Bundesliga BR-SAO] Partidas com conflito de resultados");
			String msgBody = getEscalatedMatchHtmlMessage(m, cm);
			msg.setContent(msgBody, "text/html");
			Transport.send(msg);

		} catch (AddressException e) {
			// ...
		} catch (MessagingException e) {
			// ...
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return true;
	}
	
	private static String getEscalatedMatchHtmlMessage(Match m, Match cm) {
		StringBuffer sb = new StringBuffer();
		sb.append("<html>");
		sb.append("<head></head>");
		sb.append("<body>");
		sb.append("<p>Aten&ccedil;&atilde;o Moderadores ");

		sb.append("<p>A notifica&ccedil;&atilde;o de uma partida est&aacute; sendo contestada.");
		sb.append("<br>A primeira partida notificada foi:");
		sb.append("<br>" + cm.getHomeP1());
		if (cm.getHomeP2() != null)
			sb.append(" / " + cm.getHomeP2());
		sb.append(" (" + cm.getHomeTeam() + ") " + cm.getScoreHomeTeam()
				+ " X ");
		sb.append(cm.getScoreVisitorTeam() + " " + cm.getVisitorP1());
		if (cm.getVisitorP2() != null)
			sb.append(" / " + cm.getVisitorP2());
		sb.append(" (" + cm.getVisitorTeam() + ")");

		sb.append("<p>E uma <b>nova</b> partida foi proposta:");
		sb.append("<br>" + m.getHomeP1());
		if (m.getHomeP2() != null)
			sb.append(" / " + m.getHomeP2());
		sb.append(" (" + m.getHomeTeam() + ") " + m.getScoreHomeTeam() + " X ");
		sb.append(m.getScoreVisitorTeam() + " " + m.getVisitorP1());
		if (m.getVisitorP2() != null)
			sb.append(" / " + m.getVisitorP2());
		sb.append(" (" + m.getVisitorTeam() + ")");

		sb.append("<body>");
		sb.append("</html>");

		return sb.toString();
	}
}